package com.grade.service;

import com.grade.dao.AdminDao;
import com.grade.dao.StudentDao;
import com.grade.dao.TeacherDao;
import com.grade.domain.LoginUser;
import com.grade.domain.Response;
import com.grade.domain.UserDto;
import com.grade.util.CaptchaUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Service;
import java.awt.image.BufferedImage;
import java.util.logging.Logger;

@Service
public class LoginService {

    @Resource
    private StudentDao studentDao;

    @Resource
    private TeacherDao teacherDao;

    @Resource
    private AdminDao adminDao;

    private static final Logger LOGGER = Logger.getLogger(LoginService.class.getName());

    // Global variable to store the generated captcha
    private static String captchaCache;

    /**
     * 生成验证码的方法：创建验证码文本和图片，并存储到会话中。
     * @param session 当前会话对象
     */
    public void generateCaptcha(HttpSession session) {
        // 生成随机验证码文本
        String captchaText = CaptchaUtil.generateCaptchaText();

        // 将验证码文本存储到会话中
        session.setAttribute("captcha", captchaText);

        // Store the captcha text in the global variable
        captchaCache = captchaText;

        // 记录生成的验证码文本
        LOGGER.info("Generated Captcha ServiceText: " + captchaText);

        // 创建验证码图片并存储到会话中
        BufferedImage captchaImage = CaptchaUtil.generateCaptchaImage(captchaText);
        session.setAttribute("captchaImage", captchaImage);

        // 设置会话超时时间为30分钟
        session.setMaxInactiveInterval(30 * 60); // 单位为秒
    }

    /**
     * 登录逻辑：验证用户信息（包括验证码）并返回登录结果。
     * @param loginUser 包含用户登录信息的对象
     * @param session 当前会话对象
     * @return 登录结果（成功或失败）
     */
    public Response<UserDto> login(LoginUser loginUser, HttpSession session) {
        // 检查验证码是否正确
//        String sessionCaptcha = (String) session.getAttribute("captcha");
        String sessionCaptcha = captchaCache;
        // 记录生成的验证码文本
        LOGGER.info("Generated Captcha sessionCaptchaText: " + sessionCaptcha);

        // 如果验证码为空或不匹配，返回错误信息
        if (sessionCaptcha == null || !sessionCaptcha.equalsIgnoreCase(loginUser.getCaptcha()) || !captchaCache.equalsIgnoreCase(loginUser.getCaptcha())) {
            return Response.error("验证码错误");
        }

        // 根据用户类型验证账号和密码
        UserDto rightUser = null;
        switch (loginUser.getUserType()) {
            case "student":
                rightUser = studentDao.isRightStudent(loginUser.getAccount(), loginUser.getPassword());
                break;
            case "teacher":
                rightUser = teacherDao.isRightTeacher(loginUser.getAccount(), loginUser.getPassword());
                break;
            case "admin":
                rightUser = adminDao.isRightAdmin(loginUser.getAccount(), loginUser.getPassword());
                break;
            default:
                return Response.error("用户类型不正确");
        }

        // 如果验证失败，返回错误信息
        if (rightUser == null) {
            return Response.error("账号或密码错误");
        }

        // 登录成功，返回用户信息
        return Response.success(rightUser);
    }

    /**
     * 检查用户登录时的会话是否有效。
     * @param session 当前会话对象
     * @return 是否有效
     */
    private boolean isSessionValid(HttpSession session) {
        // 获取当前会话的超时间
        long sessionMaxInactiveInterval = session.getMaxInactiveInterval();

        // 检查会话是否超时
        if (sessionMaxInactiveInterval <= 0) {
            LOGGER.warning("Session is expired or invalid.");
            return false;
        }

        return true;
    }
}
